作者:传奇之家类别:开区脚本
更新:2026-11-06查看次数:168
写脚本最让人上火的情况不是报错,是 M2 一声不响,玩家该触发的地方一点反应都没有。查半天语法,最后发现代码本身没毛病,只是放错了文件。传奇服务端的脚本是按目录分类加载的,同一段 #IF / #ACT,放进 QFunction-0.txt 能跑,塞进 QuestDiary 里就永远不会自己执行。
下面按 Mir200\Envir 目录一个个说清楚,每个位置负责什么触发,再给三段能直接抄的完整代码和一套排查顺序。
1. MapQuest_def\QFunction-0.txt
全服事件触发。升级、死亡、杀人、杀怪、穿装备、脱装备、英雄升级、复活,这类"玩家做了什么"的事件都从这里进。标签名是引擎写死的,比如 [@PlayLevelUp]、[@KillMonster]、[@TakeOnItems],你不能自己改成 [@升级奖励],改了就没人调用。
2. Market_Def\
NPC 对话脚本。文件名必须写成 NPC名-地图号.txt,例如 元宝使者-3.txt,3 是比奇省的地图号。地图号写错,NPC 会照常站在那,但点开没反应,而且不报错,这个坑每年都有人踩。
3. QuestDiary\
功能脚本仓库,自己不触发,靠 #CALL 调用。适合放多个 NPC 共用的判断和发奖逻辑,改一份全部生效。新人礼包、充值返利、活动开关这类东西放这里最省事。
4. MapEvent.txt
地图坐标事件。玩家走到指定坐标时触发,文件里只写坐标和标签名,真正的判断逻辑还是写在 QFunction-0.txt 里。
5. Robot_def\
机器人定时脚本,整点活动、全服滚动公告、每日清零用这个。它按时间跑,跟玩家动作无关。
判断一段脚本该放哪儿,只看它靠什么触发:玩家动作触发的进 QFunction-0,点 NPC 触发的进 Market_Def,到点执行的进 Robot_def,被别的脚本调用的放 QuestDiary。
升级奖励,只给一次,所以条件要写成等级等于,不要写大于:
[@PlayLevelUp]
#IF
CHECKLEVELEX = 50
#ACT
GIVE 金创药(大) 5
GAMEGOLD + 100
SENDMSG 0 恭喜 <$USERNAME> 冲到 50 级,全服红包已发!
说明:<$USERNAME> 是人物名变量,直接用,别加引号;SENDMSG 0 是全服公告,1 是当前地图,6 是只提示自己。写成 CHECKLEVELEX > 49 的话,51 级、52 级还会继续发,奖励就变刷了。
杀怪给元宝,注意控制数值,这个触发是每杀一只都跑一次:
[@KillMonster]
#IF
CHECKLEVELEX > 39
#ACT
GAMEGOLD + 1
SENDMSG 6 击杀 <$CURRTARGETNAME>,元宝 +1。
说明:<$CURRTARGETNAME> 是刚死那只怪的名字,写在提示里玩家体验会好很多。低等级地图的怪刷新快,单价一定要压低,不然一晚上就能刷出通胀。
穿戴装备触发,适合做极品装备的全服播报:
[@TakeOnItems]
#IF
CHECKITEMW 屠龙 1
#ACT
SENDMSG 0 <$USERNAME> 已经手持屠龙,路过的兄弟让一让。
说明:CHECKITEMW 判断背包或身上是否有该物品,穿上之后才会命中。全服公告只用于真正稀有的装备,普通装备也这么写,公屏会被刷爆。
新建文本文件,命名 元宝使者-3.txt,放进 Market_Def 目录,内容如下:
[@main]
#SAY
<$USERNAME>,今天想换点什么?\ \
<元宝换金币/@gold> <积分换元宝/@point> <离开/@exit>
[@gold]
#IF
CHECKGAMEGOLD > 999
#ACT
GAMEGOLD - 1000
GIVE 金币 1000000
SENDMSG 6 兑换完成,1000 元宝换 100 万金币。
#ELSEACT
SENDMSG 6 元宝不足 1000,先去打怪。
几个参数别写错:\ \ 是对话换行;尖括号里前半截是玩家看到的文字,后半截是点击后跳转的标签;@exit 是引擎内置的关闭对话标签,不要自己再定义一遍。最容易被忽略的是 #ELSEACT,只写 #ACT 的话,元宝不够的玩家点下去毫无反应,还以为是脚本坏了。
把公共逻辑单独放一个文件,比如 QuestDiary\公共函数.txt:
[@发奖励]
#IF
CHECKLEVELEX > 9
#ACT
GIVE 金币 10000
SENDMSG 6 新人礼包已发放。
任何 NPC 里加一行就能调用,不用复制粘贴:
#CALL [\QuestDiary\公共函数.txt] @发奖励
地图事件则写在 Envir\MapEvent.txt,一行一个触发点,六个字段用 Tab 分开:
3 330 330 3 0 @比奇传送
依次是:地图号、坐标 X、坐标 Y、范围、触发类型、标签。触发类型 0 是进入、1 是离开,个别引擎版本有差异,改完看 M2 加载日志能确认。标签内容仍然写在 QFunction-0.txt:
[@比奇传送]
#IF
CHECKLEVELEX < 10
#ACT
SENDMSG 6 10 级以前不能进比奇,先去新手村练级。
MAPMOVE 0 289 618
这里逻辑是反的:等级小于 10 才执行拦截并把人物送回新手村,10 级以上条件不成立,脚本自然结束,玩家正常进图。
变量:<$USERNAME> 人物名、<$LEVEL> 等级、<$GAMEGOLD> 元宝、<$GAMEPOINT> 积分、<$MAP> 当前地图、<$X> 与 <$Y> 坐标、<$CURRTARGETNAME> 当前目标名。
容器:N0-N99 存数字,S0-S99 存字符,[000]-[999] 是开关变量,只有 0 和 1。用 MOV 赋值、INC 加、DEC 减、MUL 乘、DIV 除。
判断:CHECK 查开关、CHECKITEMW 查物品、CHECKGAMEGOLD 查元宝、CHECKGAMEPOINT 查积分、CHECKLEVELEX 查等级、CHECKMAPNAME 查地图。
执行:GIVE 给物品、TAKE 收物品、GAMEGOLD 增减元宝、GAMEPOINT 增减积分、MAPMOVE 传送、DELAYGOTO 延时跳转、BREAK 结束当前段、CLOSE 关闭对话。
1. 打开 M2 启动日志,搜 Script Error,后面的行号是相对当前文件的,不是整个服务端的行号。
2. 检查文件编码,必须是 ANSI(GBK)。用记事本另存成 UTF-8 之后,中文标签会读成乱码,整段直接不加载,也不一定有明显报错。
3. 标签 [@xxx] 和 #IF、#ACT 都要顶格写,前面多一个空格,引擎就当普通文字跳过了。
4. MapEvent.txt 里只写坐标和标签,判断条件必须回到 QFunction-0.txt,写在事件文件里不生效,这也是地图触发最容易漏的一步。
5. 改完要重载脚本,M2 里重新加载 NPC 与脚本,或者直接重启 M2。保存文件不等于生效,这一步漏掉的人最多。
6. NPC 不出现或者点不开,回头检查文件名里的地图号,名字和地图号之间是英文短横线。
第一,N、S、[] 这些变量都存在内存里,M2 一重启就归零。要做累积充值、累计在线这类需要长期保留的数据,得用文本记录或引擎自带的全局变量功能,不能只靠 [101] 这种开关。
第二,GIVE 给金币单次不要超过 21 亿,超了会变成负数,玩家金币直接清零。大额奖励拆成几次给,或者改用元宝发放。
另外,换引擎时先把积分类命令单独测一遍,GOM、GEE、HGE 大体一致,个别命令名不同,别整套直接搬过去。
脚本这行没有玄学,触发不生效基本就是位置、编码、重载这三件事。把上面的目录对照表存下来,下次写完先对一遍放在哪,比对着 M2 日志猜要快得多。